﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Sistema.Util
{
    public class Arquivo
    {

        public Arquivo()
        {

        }

        public IList<String> ListarArquivo(String path)
        {
            try
            {
                this.verificaSePastaExiste(path);
                DirectoryInfo dir = new DirectoryInfo(path);
                IList<string> lista = new List<String>();
                foreach (FileInfo file in dir.GetFiles())
                {
                    lista.Add(file.FullName);
                }
                return lista;
            }
            catch (Exception)
            {

                throw;
            }
        }

        public IList<String> ListarArquivo(String path, String Nome)
        {
            try
            {
                this.verificaSePastaExiste(path);
                DirectoryInfo dir = new DirectoryInfo(path);
                IList<string> lista = new List<String>();
                foreach (FileInfo file in dir.GetFiles(Nome))
                {
                    lista.Add(file.FullName);
                }
                return lista;
            }
            catch (Exception)
            {

                throw;
            }
        }

        public String LerArquivo(String arquivo)
        {
            try
            {
                string conteudo;
                StreamReader reader = new StreamReader(arquivo);
                conteudo = reader.ReadToEnd();
                reader.Close();
                return conteudo;
            }
            catch (Exception ex)
            {
                throw new UtilException("Erro ao ler o arquivo " + arquivo + " causado por " + ex.Message,
                    "Houve um erro ao tentar ler o arquivo " + arquivo, ex);
            }
        }

        public IEnumerable<String> LerArquivo(IList<String> lista)
        {
            foreach (String caminho in lista)
            {
                yield return this.LerArquivo(caminho);
            }
        }

        public void verificaSePastaExiste(string diretorio)
        {
            if (!Directory.Exists(diretorio))
            {
                Directory.CreateDirectory(diretorio);
            }
        }

        public String NomeArquivo(String caminho)
        {
            //this.verificaSePastaExiste(caminho);
            String[] aux = caminho.Split('\\');

            if (File.Exists(caminho))
            {
                return aux.Last();
            }
            else
            {
                throw new UtilException("Arquivo não existente", "Arquivo não existe, Por favor selecione um arquivo válido.");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="arquivoOrigem">Arquivo origem </param>
        /// <param name="arquivoDestino">Arquivo destino da operacao</param>
        public void MoverArquivo(String arquivoOrigem, String arquivoDestino)
        {
            try
            {
                

                if (File.Exists(arquivoDestino))
                {
                   this.ExcluirArquivo(arquivoDestino);
                }

                FileInfo arquivo = new FileInfo(arquivoOrigem);
                arquivo.MoveTo(arquivoDestino);
            }
            catch (Exception ex)
            {
                throw new UtilException(ex.Message, "Erro ao Mover Arquivo para pasta destino.", ex);

            }
        }


        public void ExcluirArquivo(String arquivo, String diretorio)
        {
            try
            {
             
                Directory.SetCurrentDirectory(diretorio);
                FileInfo file = new FileInfo(arquivo);
                file.Delete();
            }
            catch (Exception ex)
            {
                throw new UtilException(ex.Message, "Erro ao excluir arquivo da pasta.");
            }

        }

        public void ExcluirArquivo(String arquivo)
        {
            try
            {
                String diretorio = Path.GetDirectoryName(arquivo);
                String nomeArquivo = Path.GetFileName(arquivo);

                Directory.SetCurrentDirectory(diretorio);
                FileInfo file = new FileInfo(nomeArquivo);
                file.Delete();
            }
            catch (Exception ex)
            {
                throw new UtilException(ex.Message, "Erro ao excluir arquivo da pasta.");
            }

        }
        

        public void ExcluirArquivo(IList<String> arquivo,String diretorio)
        {
            try
            {
                Directory.SetCurrentDirectory(diretorio);
                for (int i = 0; i < arquivo.Count; i++)
                { 
                FileInfo file = new FileInfo(arquivo[i]);
                file.Delete();
                }
            }
            catch (Exception ex)
            {
                throw new UtilException(ex.Message, "Erro ao excluir arquivo da pasta.");
            }

        }
       
        public void CriarArquivo(String dados, String NomeArquivo, String caminho)
        {
          String lista = dados;

            this.verificaSePastaExiste(caminho);
                       
            Directory.SetCurrentDirectory(caminho);
            String nome = NomeArquivo;

            String path = caminho +"\\"+ nome;
            

                if (File.Exists(path))
                {
                   this.ExcluirArquivo(nome, caminho);
                }
                  
                    StreamWriter writer = new StreamWriter(path);
                    writer.Write(dados);
                    writer.Close();
                
                
            

            
        }

        public IList<String> buscarArquivo(String diretorio)
        {
            
            Directory.SetCurrentDirectory(diretorio);
            IList<String> lista = this.ListarArquivo(diretorio);
            IList<String> retorno = new List<String>();
            for (int i = 0; i < lista.Count; i++)
            {
                String[] pedaco = lista[i].Split('\\');
                retorno.Add(pedaco.Last());
            }

                return retorno;
        }

        public IList<String> buscarArquivo(String diretorio,String arquivo)
        {

            Directory.SetCurrentDirectory(diretorio);
            var file = Directory.GetFiles(diretorio, arquivo);
            IList<String> lista = file.ToList<String>();//this.ListarArquivo(diretorio);
            IList<String> retorno = new List<String>();
            for (int i = 0; i < lista.Count; i++)
            {
                String[] pedaco = lista[i].Split('\\');
                retorno.Add(pedaco.Last());
            }
            
            return retorno;
        }
    }
}
